home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume91 / news / vnres112 / part03 / help.c < prev    next >
C/C++ Source or Header  |  1991-03-14  |  9KB  |  376 lines

  1. /*
  2. ** vn news reader.
  3. **
  4. ** help.c - print help
  5. **
  6. ** see copyright disclaimer / history in vn.c source file
  7. */
  8. #include <stdio.h>
  9. #include <setjmp.h>
  10. #include "config.h"
  11. #include "tty.h"
  12. #include "tune.h"
  13. #include "node.h"
  14. #include "page.h"
  15. #include "reader.h"
  16. #include "vn.h"
  17.  
  18. extern int L_allow;
  19. extern int C_allow;
  20. extern int Digest;
  21. extern char *Contstr;
  22. extern char Cxptoi[], Cxrtoi[];
  23.  
  24. extern int (*Hookfunc)();
  25. extern char *(*Hookhelp)();
  26.  
  27. static h_print ();
  28.  
  29. /*
  30.     Help message table.  Character for command, plus its help
  31.     message.  Table order is order of presentation to user.
  32. */
  33. static struct HELPTAB
  34. {
  35.     char cmd, *msg;
  36.     int dig;
  37.     char *amsg;
  38. Helptab [] =
  39. {
  40.     { QUIT, "quit", 1, NULL},
  41.     { UP, "(or up arrow) move up [number of lines]", 1, NULL},
  42.     { DOWN, "(or down arrow) move down [number of lines]", 1, NULL},
  43. #ifdef PAGEARROW
  44.     { BACK, "(or left arrow) previous page [number of pages]", 1, NULL},
  45.     { FORWARD, "(or right arrow) next page [number of pages]", 1, NULL},
  46. #else
  47.     { BACK, "previous page [number of pages]", 1, NULL},
  48.     { FORWARD, "next page [number of pages]", 1, NULL},
  49. #endif
  50.     { GRPBACK, "previous newsgroup [number of newsgroups]", 0, NULL },
  51.     { GRPFORWARD, "next newsgroup [number of newsgroups]", 0, NULL },
  52.     { TOPMOVE, "move to top of page", 1, NULL},
  53.     { BOTMOVE, "move to bottom of page", 1, NULL},
  54.     { ALTBOTTOM, "move to bottom of page (alternate L)", 1, NULL},
  55.     { MIDMOVE, "move to middle of page", 1, NULL},
  56.     { DIGEST, "unpack digest", 1, "exit digest"},
  57.     { READ, "read article [number of articles]", 1, NULL},
  58.     { ALTREAD, "read article (alternate 'r')", 1, NULL},
  59.     { READALL, "read all articles on page", 1, NULL},
  60.     { READSTRING, "specify articles to read", 1, NULL},
  61.     { SAVE, "save or pipe article [number of articles]", 1, NULL},
  62.     { SAVEALL, "save or pipe all articles on page", 1, NULL},
  63.     { SAVESTRING, "specify articles to save", 1, NULL},
  64.     { ALTSAVE, "specify articles to save (alternate ctl-s)", 1, NULL},
  65.     { PRINT, "print article [number of articles]", 1, NULL},
  66.     { PRINTALL, "print all article on page", 1, NULL},
  67.     { PRINTSTRING, "specify articles to print", 1, NULL},
  68.     { UPDATE, "update .newsrc status to cursor", 0, NULL},
  69.     { UPALL, "update .newsrc status for whole newsgroup", 0, NULL},
  70.     { UPSEEN, "update .newsrc status for all pages displayed", 0, NULL},
  71.     { ORGGRP, "recover original .newsrc status for newsgroup", 0, NULL},
  72.     { ORGSTAT, "recover all original .newsrc status", 0, NULL},
  73.     { SSTAT, "display count of groups and pages - shown and total", 0, NULL},
  74.     { GRPLIST, "list newsgroups with new article, updated counts", 0, NULL},
  75.     { NEWGROUP, "specify newsgroup to display and/or resubscribe to", 1, NULL},
  76.     { UNSUBSCRIBE, "unsubscribe from group", 0, NULL},
  77.     { MARK, "mark/unmark article [number of articles]", 1, NULL},
  78.     { ART_MARK, "mark/unmark article [number of articles]", 1, NULL},
  79.     { UNMARK, "erase marks on articles", 1, NULL},
  80.     { MARKSTRING, "specify articles to mark/unmark", 1, NULL},
  81.     { HEADTOG, "toggle flag for display of headers when reading", 1, NULL},
  82.     { SETROT, "toggle rotation for reading", 1, NULL},
  83.     { REDRAW, "redraw screen", 1, NULL},
  84. #ifdef amiga
  85.     { UNESC, "escape to AMIGADOS to execute a command", 1, NULL},
  86. #else
  87.     { UNESC, "escape to UNIX to execute a command", 1, NULL},
  88. #endif
  89.     { PRTVERSION, "show vn version", 1, NULL},
  90.     { HELP, "show this help menu", 1, NULL}
  91. };
  92.  
  93. #define HTSIZE (sizeof(Helptab)/sizeof(struct HELPTAB))
  94.  
  95.  
  96. #ifdef amiga
  97. extern char pr_buf[];
  98. extern ttputc ();
  99. #endif
  100.  
  101. #define HHLINES 5    /* lines (CRs + 1) contained in HELP_HEAD */
  102. /*
  103.     help from main screen
  104. */
  105. help ()
  106. {
  107.     int i,lcount,lim;
  108.     char *hs;
  109.     char c;
  110.  
  111.     term_set (ERASE);
  112.     lim = L_allow + RECBIAS - 2;
  113. #ifdef amiga
  114.     sprintf(pr_buf,"%s\n","[...] = effect of optional number preceding command\n");
  115.     tputs(pr_buf,1,ttputc);
  116.     sprintf(pr_buf,"%s\n","pipes are specified by filenames beginning with |\n");
  117.     tputs(pr_buf,1,ttputc);
  118.     sprintf(pr_buf,"%s\n","articles specified as a list of numbers, title search string, or\n");
  119.     tputs(pr_buf,1,ttputc);
  120.     sprintf(pr_buf,"%s\n","    * to specify marked articles.  ! may be used to negate any\n");
  121.     tputs(pr_buf,1,ttputc);
  122. #else
  123.     printf("%s\n","[...] = effect of optional number preceding command\n");
  124.     printf("%s\n","pipes are specified by filenames beginning with |\n");
  125.     printf("%s\n","articles specified as a list of numbers, title search string, or\n");
  126.     printf("%s\n","    * to specify marked articles.  ! may be used to negate any\n");
  127. #endif
  128.     lcount = HHLINES;
  129.     for (i=0; i < HTSIZE; ++i)
  130.     {
  131.         if (Digest && !(Helptab[i].dig))
  132.             continue;
  133.         if (Hookfunc != NULL && (*Hookfunc)(Helptab[i].cmd,0,0) >= 0)
  134.             continue;
  135.         ++lcount;
  136.         if (Digest && Helptab[i].amsg != NULL)
  137.             h_print (Cxptoi[Helptab[i].cmd],Helptab[i].amsg);
  138.         else
  139.             h_print (Cxptoi[Helptab[i].cmd],Helptab[i].msg);
  140.         if (lcount >= lim)
  141.         {
  142. #ifdef amiga
  143.             sprintf (pr_buf,"\n%s",Contstr);
  144.             tputs(pr_buf,1,ttputc);
  145. #else
  146.             printf ("\n%s",Contstr);
  147. #endif
  148.             getnoctl ();
  149.             term_set (MOVE,0,lim+1);
  150.             term_set (ZAP,0,strlen(Contstr));
  151.             term_set (MOVE,0,lim-1);
  152.             putchar ('\n');
  153.             lcount = 0;
  154.         }
  155.     }
  156.     if (Hookhelp != NULL)
  157.     {
  158.         for (hs=(*Hookhelp)(0,1,&c);
  159.                 hs != NULL; hs = (*Hookhelp)(0,0,&c))
  160.         {
  161.             ++lcount;
  162.             h_print (Cxptoi[c],hs);
  163.             if (lcount >= lim)
  164.             {
  165. #ifdef amiga
  166.                 sprintf (pr_buf,"\n%s",Contstr);
  167.                 tputs(pr_buf,1,ttputc);
  168. #else
  169.                 printf ("\n%s",Contstr);
  170. #endif
  171.                 getnoctl ();
  172.                 term_set (MOVE,0,lim+1);
  173.                 term_set (ZAP,0,strlen(Contstr));
  174.                 term_set (MOVE,0,lim-1);
  175.                 putchar ('\n');
  176.                 lcount = 0;
  177.             }
  178.         }
  179.     }
  180.     if (lcount > 0)
  181.     {
  182. #ifdef amiga
  183.         sprintf (pr_buf,"\n%s",Contstr);
  184.         tputs(pr_buf,1,ttputc);
  185. #else
  186.         printf ("\n%s",Contstr);
  187. #endif
  188.         getnoctl ();
  189.     }
  190. }
  191.  
  192. /*
  193.     help from reader
  194. */
  195. help_rd()
  196. {
  197.     char *hs;
  198.     char c;
  199.  
  200. #ifdef amiga
  201.     sprintf(pr_buf,"\n");    /* "confused" tab expansion on first line */
  202.     tputs(pr_buf,1,ttputc);
  203. #else
  204.     printf("\n");    /* "confused" tab expansion on first line */
  205. #endif
  206.  
  207.     hr_print (Cxrtoi[PG_NEXT],HPG_NEXT);
  208.     hr_print (Cxrtoi[PG_QUIT],HPG_QUIT);
  209.     hr_print (Cxrtoi[PG_FLIP],HPG_FLIP);
  210.     hr_print (Cxrtoi[PG_REWIND],HPG_REWIND);
  211.     hr_print (Cxrtoi[PG_WIND],HPG_WIND);
  212.     hr_print (Cxrtoi[PG_SEARCH],HPG_SEARCH);
  213.     hr_print (Cxrtoi[PG_STEP],HPG_STEP);
  214.     hr_print (Cxrtoi[PG_REPLY],HPG_REPLY);
  215.     hr_print (Cxrtoi[PG_FOLLOW],HPG_FOLLOW);
  216.     hr_print (Cxrtoi[SAVE],HPG_SAVE);
  217.     hr_print (Cxrtoi[PRINT],HPG_PRINT);
  218.     hr_print (Cxrtoi[SETROT],HPG_ROT);
  219.     hr_print (Cxrtoi[HEADTOG],HPG_HEAD);
  220.     hr_print (Cxrtoi[PG_HELP],HPG_HELP);
  221.     if (Hookhelp != NULL)
  222.     {
  223.         for (hs=(*Hookhelp)(1,1,&c);
  224.                 hs != NULL; hs = (*Hookhelp)(1,0,&c))
  225.             h_print (Cxrtoi[c],hs);
  226.     }
  227. #ifdef amiga
  228.     sprintf (pr_buf,"%s\n",HPG_DEF);
  229.     tputs(pr_buf,1,ttputc);
  230. #else
  231.     printf ("%s\n",HPG_DEF);
  232. #endif
  233. }
  234.  
  235. hr_print(c,msg)
  236. char c;
  237. char *msg;
  238. {
  239.     if (Hookfunc == NULL || (*Hookfunc)(c,1,0) < 0)
  240.         h_print(c,msg);
  241. }
  242.  
  243. srch_help(c,dig)
  244. char c;
  245. int *dig;
  246. {
  247.     int i;
  248.  
  249.     for (i=0; i < HTSIZE; ++i)
  250.         if (Helptab[i].cmd == c)
  251.             break;
  252.     if (i < HTSIZE)
  253.     {
  254.         *dig = Helptab[i].dig;
  255.         return (0);
  256.     }
  257.     return(-1);
  258. }
  259.  
  260. /*
  261.     h_print prints a character and a legend for a help menu.
  262. */
  263. static
  264. h_print(c,s)
  265. char c,*s;
  266. {
  267.     if (strlen(s) > (C_allow - 14))
  268.         s [C_allow - 14] = '\0';
  269.     if (c > ' ' && c != '\177') {
  270. #ifdef amiga
  271.         sprintf (pr_buf,"     %c - %s\n",c,s);
  272.         tputs(pr_buf,1,ttputc);
  273. #else
  274.         printf ("     %c - %s\n",c,s);
  275. #endif
  276.     } else
  277.     {
  278.         switch (c)
  279.         {
  280.         case '\177':
  281. #ifdef amiga
  282.             sprintf (pr_buf,"  <delete> - %s\n",s);  
  283.             tputs(pr_buf,1,ttputc);
  284. #else
  285.             printf ("  <delete> - %s\n",s);  
  286. #endif
  287.             break;
  288.         case '\040':
  289. #ifdef amiga
  290.             sprintf (pr_buf,"   <space> - %s\n",s);  
  291.             tputs(pr_buf,1,ttputc);
  292. #else
  293.             printf ("   <space> - %s\n",s);  
  294. #endif
  295.             break;
  296.         case '\033':
  297. #ifdef amiga
  298.             sprintf (pr_buf,"  <escape> - %s\n",s);  
  299.             tputs(pr_buf,1,ttputc);
  300. #else
  301.             printf ("  <escape> - %s\n",s);  
  302. #endif
  303.             break;
  304.         case '\n':
  305. #ifdef amiga
  306.             sprintf (pr_buf,"  <return> - %s\n",s);  
  307.             tputs(pr_buf,1,ttputc);
  308. #else
  309.             printf ("  <return> - %s\n",s);  
  310. #endif
  311.             break;
  312.         case '\t':
  313. #ifdef amiga
  314.             sprintf (pr_buf,"     <tab> - %s\n",s);  
  315.             tputs(pr_buf,1,ttputc);
  316. #else
  317.             printf ("     <tab> - %s\n",s);  
  318. #endif
  319.             break;
  320.         case '\b':
  321. #ifdef amiga
  322.             sprintf (pr_buf," <back sp> - %s\n",s);  
  323.             tputs(pr_buf,1,ttputc);
  324. #else
  325.             printf (" <back sp> - %s\n",s);  
  326. #endif
  327.             break;
  328.         case '\f':
  329. #ifdef amiga
  330.             sprintf (pr_buf,"<formfeed> - %s\n",s);  
  331.             tputs(pr_buf,1,ttputc);
  332. #else
  333.             printf ("<formfeed> - %s\n",s);  
  334. #endif
  335.             break;
  336.         case '\07':
  337. #ifdef amiga
  338.             sprintf (pr_buf,"    <bell> - %s\n",s);  
  339.             tputs(pr_buf,1,ttputc);
  340. #else
  341.             printf ("    <bell> - %s\n",s);  
  342. #endif
  343.             break;
  344.         case '\0':
  345. #ifdef amiga
  346.             sprintf (pr_buf,"    <null> - %s\n",s);  
  347.             tputs(pr_buf,1,ttputc);
  348. #else
  349.             printf ("    <null> - %s\n",s);  
  350. #endif
  351.             break;
  352.         default:
  353.             if (c < '\033')
  354.             {
  355.                 c += 'a' - 1;
  356. #ifdef amiga
  357.                 sprintf(pr_buf," control-%c - %s\n",c,s);
  358.                 tputs(pr_buf,1,ttputc);
  359. #else
  360.                 printf(" control-%c - %s\n",c,s);
  361. #endif
  362.             }
  363.             else {
  364. #ifdef amiga
  365.                 printf(pr_buf,"       %c0%o - %s\n",'\\',(int) c,s);
  366.                 tputs(pr_buf,1,ttputc);
  367. #else
  368.                 printf("       %c0%o - %s\n",'\\',(int) c,s);
  369. #endif
  370.             }
  371.             break;
  372.         }
  373.     }
  374. }
  375.